package com.kexio.user.service;

import java.util.List;

import com.baomidou.mybatisplus.extension.service.IService;
import com.kexio.user.entity.Dept;

/**
 * 部门服务接口
 * 
 * @author Kexio Team
 * @since 1.0.0
 */
public interface DeptService extends IService<Dept> {
    
    /**
     * 获取部门树形结构
     * 
     * @return 部门树列表
     */
    List<Dept> getDeptTree();
    
    /**
     * 获取指定租户的部门树形结构
     * 
     * @param tenantId 租户ID
     * @return 部门树列表
     */
    List<Dept> getDeptTreeByTenant(String tenantId);
    
    /**
     * 根据ID获取部门信息（包含子部门和成员统计）
     * 
     * @param deptId 部门ID
     * @return 部门详细信息
     */
    Dept getDeptDetailById(String deptId);
    
    /**
     * 保存部门信息
     * 
     * @param dept 部门信息
     * @return 保存结果
     */
    boolean saveDept(Dept dept);
    
    /**
     * 更新部门信息
     * 
     * @param dept 部门信息
     * @return 更新结果
     */
    boolean updateDept(Dept dept);
    
    /**
     * 删除部门（逻辑删除）
     * 
     * @param deptId 部门ID
     * @return 删除结果
     */
    boolean deleteDept(String deptId);
    
    /**
     * 批量删除部门
     * 
     * @param deptIds 部门ID列表
     * @return 删除结果
     */
    boolean deleteDepts(List<String> deptIds);
    
    /**
     * 获取部门及其所有子部门ID
     * 
     * @param deptId 部门ID
     * @return 部门ID列表（包含自身和所有子部门）
     */
    List<String> getDeptAndChildIds(String deptId);
    
    /**
     * 获取部门的直接子部门ID列表
     * 
     * @param parentId 父部门ID
     * @return 子部门ID列表
     */
    List<String> getChildDeptIds(String parentId);
    
    /**
     * 获取用户所属部门ID
     * 
     * @param userId 用户ID
     * @param tenantId 租户ID
     * @return 部门ID
     */
    String getUserDeptId(String userId, String tenantId);
    
    /**
     * 获取部门路径（从根部门到当前部门）
     * 
     * @param deptId 部门ID
     * @return 部门路径字符串
     */
    String getDeptPath(String deptId);
    
    /**
     * 校验部门编码是否唯一
     * 
     * @param deptCode 部门编码
     * @param tenantId 租户ID
     * @param excludeId 排除的部门ID（用于编辑时排除自己）
     * @return true-唯一，false-重复
     */
    boolean isCodeUnique(String deptCode, String tenantId, String excludeId);
    
    /**
     * 校验是否可以删除部门
     * 
     * @param deptId 部门ID
     * @return true-可以删除，false-不能删除
     */
    boolean canDelete(String deptId);
    
    /**
     * 移动部门到新的父部门下
     * 
     * @param deptId 部门ID
     * @param newParentId 新父部门ID
     * @param targetOrder 目标排序位置
     * @return 移动结果
     */
    boolean moveDept(String deptId, String newParentId, Integer targetOrder);
    
    /**
     * 获取可选的父部门列表（排除自己和子部门）
     * 
     * @param deptId 部门ID
     * @param tenantId 租户ID
     * @return 可选父部门列表
     */
    List<Dept> getAvailableParentDepts(String deptId, String tenantId);
    
    /**
     * 获取部门统计信息
     * 
     * @param tenantId 租户ID
     * @return 统计信息Map
     */
    java.util.Map<String, Object> getDeptStatistics(String tenantId);
    
    /**
     * 构建部门树形结构
     * 
     * @param depts 部门列表
     * @param parentId 父部门ID
     * @return 树形结构列表
     */
    List<Dept> buildDeptTree(List<Dept> depts, String parentId);
}

